package apibasej.db.sql.wrapper;

import apibasej.db.metadata.Col;



public class ColSelect<T> extends SqlPart<T>{

	
	
	private Class<?> classCol = null; // usar qualquer tipo para poder trocar na hora no select
	private String strForColSelectWithoutAlias = null; //EX: length(nome_col)
	
	private String aliasSelect = null; //EX: length(nome_col) as LEN ...
	private String strForColSelect = null; //String completa. EX: length(nome_col) as LEN ...
	
	private Integer orderForGroupBy = null;
	
	private boolean ignoreResultNullForPrimitives = false;// O padrão é não ignorar, ou seja, retornar null. Se setar true para um Integer null irá retornar 0
	
	
	public ColSelect(WrapperTab wrapperTab, Col<T> col) {// PODEM TER wrappers ColSelect SEM wrapperTab ???
		super(wrapperTab, col);
	}
	
	public ColSelect(String strForColSelect, Class<T> classCol) {// EX: COUNT(*) AS ct não tem tab nem col ...
		super(null, null);
		this.strForColSelect = strForColSelect;
		this.classCol = classCol;
	}
	public ColSelect(String strForColSelectWithoutAlias, String aliasSelect, Class<T> classCol) {// EX: COUNT(*) AS ct não tem tab nem col ...
		super(null, null);
		this.strForColSelectWithoutAlias = strForColSelectWithoutAlias;
		this.aliasSelect = aliasSelect;
		this.classCol = classCol;
	}
	
	public String getStrForColSelect() {
		if(strForColSelect==null){
			String s = getStrForColSelectWithoutAlias();
			if(aliasSelect!=null){
				s = s+" AS "+aliasSelect;
			}
			return s;
		}else{
			return strForColSelect;
		}
	}
	public String getStrForColSelectWithoutAlias() {
		if(strForColSelectWithoutAlias==null){
			StringBuilder s = new StringBuilder();
			/* da erro se tiver o schema adicionado no nome da tabela (não precisa adicionar o nome da tabela, pois se tiver mais de uma erá o alias)
			if(getWrapperTab()!=null){
				if(getWrapperTab().getAliasTab()!=null) s.append(getWrapperTab().getAliasTab());
				else s.append(getWrapperTab().getTab().getName());// colocar tab.col, pois pode ter outras tabelas sem alias com colunas com mesmo nome
				s.append('.');
			}*/
			if(getWrapperTab()!=null && getWrapperTab().getAliasTab()!=null){
				s.append(getWrapperTab().getAliasTab());
				s.append('.');
			}
			s.append(getCol().getName());
			return s.toString();
		}
		return strForColSelectWithoutAlias;
	}

	
	public String getAliasSelect() {
		return aliasSelect;
	}
	public void setAliasSelect(String aliasSelect) {
		this.aliasSelect = aliasSelect;
	}
	public void setStrForColSelect(String strForColSelect) {
		this.strForColSelect = strForColSelect;
	}

	public Class<?> getClassCol() {
		if(classCol==null){
			if(getCol()!=null) return getCol().getClassCol();
			else return null;
		}else{
			return classCol;
		}
	}

	public void setClassCol(Class<?> classCol) {
		this.classCol = classCol;
	}

	public void setStrForColSelectWithoutAlias(String strForColSelectWithoutAlias) {
		this.strForColSelectWithoutAlias = strForColSelectWithoutAlias;
	}

	public Integer getOrderForGroupBy() {
		return orderForGroupBy;
	}

	public void setOrderForGroupBy(Integer orderForGroupBy) {
		this.orderForGroupBy = orderForGroupBy;
	}

	public boolean isIgnoreResultNullForPrimitives() {
		return ignoreResultNullForPrimitives;
	}

	public void setReturnPrimitiveIfNull(boolean ignoreResultNullForPrimitives) {
		this.ignoreResultNullForPrimitives = ignoreResultNullForPrimitives;
	}

	@Override
	public String toString() {
		return "["+super.toString()+", col: "+getCol()+"]";
	}

	@Override
	public boolean equals(Object obj) {
		return this==obj;
	}
	
}
